#pragma once

#include <string>
#include <vector>
#include <unordered_set>
#include "DFA.h"

struct Token {
    int num;
    std::string type;
    std::string content;
    int line_num;
};

class My_lex
{
public:
    void init();

    void get_input(std::string &input);

    bool analysis(std::vector<Token*> &result);

    void print(std::vector<Token *> &result);

    int line_num() { return line_num_; }

private:
    bool next_token(Token *result);

    bool reserve(std::string content);

    void jump_blank();

    bool jump_anno();

    void jump_line();

private:
    std::string input_;                 // 输入文本
    int ptr = 0;                        // 记录当前读取位置
    DFA dfa;                            // DFA
    int num_ = 0;                        // 当前序号
    std::unordered_set<std::string> reserve_;  // 保留字表
    char non_letter_and_num[19] = {';', '=', '(', ')', ',', '{', '}', '|', '&', '<', '>', '=', '!', '=', '-', '*', '/', '%', ' '};
    int line_num_ = 1;
};